package q147_insertionSortList;

import CommonClass.Common.ListNode;
public class Solution {
    /*
    此题指定了插入排序
    这里分为五个过程
     */
    public ListNode insertionSortList(ListNode head) {
        // 1 首先判空
        if (head == null || head.next == null) {
            return head;
        }
        // 2 创建哑节点
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;

        // 3 使用一个节点用来记录链表 已经排序 部分的 最后一个 节点
        // 4 cur节点是等待插入的元素 初始化为head.next
        ListNode lastSorted = head, curr = head.next;

        while (curr != null) {
            // 进行比较
            // a.如果已排序的最后一个节点小于当前节点 只需要后移lastSorted节点
            if (lastSorted.val <= curr.val) {
                lastSorted = lastSorted.next;
            } else {
                // b.否则就要从头节点开始找 直到找到第一个大于curr节点的节点
                // 然后将其前一个节点连接到curr节点上 curr节点的后一个节点接到原有的后面节点
                ListNode prev = dummyHead;
                while (prev.next.val <= curr.val) {
                    prev = prev.next;
                }
                // 断开curr 并对应接入
                lastSorted.next = curr.next;
                curr.next = prev.next;
                prev.next = curr;
            }
            // 最后都要更新curr节点
            curr = lastSorted.next;
        }
        return dummyHead.next;
    }
}
